home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / sharew / musik / bytes / deztovln.s next >
Encoding:
Text File  |  1989-04-05  |  2.4 KB  |  76 lines

  1. ###########################################################################
  2. #    Routine zur Erzeugung und Verarbeitung von Variable Length      #
  3. #              Numbers, (C)1993 Stephan M. Sprenger              #
  4. #        geschrieben mit BORLAND PURE C Assembler          #
  5. ###########################################################################
  6.  
  7.  
  8. .TEXT
  9.  
  10.  
  11.         bra.s        start         ; zum Programmstart
  12.         dc.l        0         ; Opcode-Feld
  13.         dc.l        0         ; Feld für die Zahl
  14.  
  15. start:        lea.l        -10(pc),a0     ; Startadresse in a0
  16.         move.l        4(a0),d1     ; Wert in d1
  17.         tst.b        (a0)         ; Opcode feststellen
  18.         beq.s        vln_to_dez     ; Opcode=0, dann VLN->DEZ
  19.  
  20. #################### Konvertierung Dezimalzahl --> VLN #####################
  21.  
  22. dez_to_vln:    cmp.l        #$fffffff,d1     ; Test auf Maximalwert
  23.         bhi.s        error1         ; größer?, dann Fehler
  24.  
  25.         moveq.l        #3,d0         ; Zähler für Bytes
  26.         
  27. loop1:        lsl.l        #1,d1         ; Langwort shiften
  28.         lsr.b        #1,d1         ; Lo-Byte zurück
  29.         bclr        #7,d1         ; Bit 7 löschen
  30.         cmp        #3,d0         ; erstes Byte?
  31.         beq.s        weiter         ; dann weiter
  32.         tst.b        d1         ; Byte ist Null?
  33.         beq.s        weiter         ; dann nix setzen..
  34.         bset        #7,d1         ; ..sonst Bit 7 setzen
  35. weiter:        move.b        d1,d2          ; errechnetes Byte in d2
  36.         ror.l        #8,d2         ; d2 nach rechts rotieren
  37.         lsr.l        #8,d1         ; d1 um 1 Byte weiter
  38.         dbra        d0,loop1     ; zum Schleifenanfang
  39.  
  40.         btst        #23,d2         ; Bit 23 gesetzt?
  41.         beq.s        higher         ; nicht gesetzt, dann weiter
  42.         bset        #15,d2         ; sonst Bit 15 setzen
  43.  
  44. higher:        btst        #31,d2         ; Bit 31 gesetzt?
  45.         beq.s        ende         ; nein, dann fertig
  46.         ori.l        #$808000,d2     ; doch, dann Bits 23 und 15 setzen
  47.  
  48. ende:        move.l        d2,4(a0)     ; errechneten Wert in Feld
  49.         moveq.l        #0,d0         ; kein Fehler (d0=0)
  50.         rts                 ; Programmende
  51.  
  52. error1:        move.l        #$fffffff7,4(a0) ; Maximalwert zurückliefern
  53.         moveq.l        #-1,d0          ; -1 für Fehler
  54.         rts                 ; Programmende
  55.  
  56. #################### Konvertierung VLN --> Dezimalzahl #####################
  57.  
  58. vln_to_dez:    cmp.l        #$fffffff7,d1     ; Test auf Maximalwert
  59.         bhi.s        error2         ; größer? dann Fehler
  60.  
  61.         moveq.l        #3,d0         ; Zähler für Bytes
  62.         
  63. loop2:        move.b        d1,d2         ; Lo-Byte nach d2 kopieren
  64.         ror.l        #7,d2         ; um 7 Bits rotieren
  65.         lsr.l        #8,d1         ; d1 um 8 Bits shiften
  66.         dbra        d0,loop2     ; und nochmal...
  67.         ror.l        #4,d2         ; 4 Bits übrig..
  68.         andi.l        #$0fffffff,d2     ; ..und auf 0 setzen
  69.         bra.s        ende         ; zum Programmende
  70.  
  71. error2:        move.l        #$fffffff,4(a0)     ; Maximalwert zurückliefern
  72.         moveq.l        #-1,d0         ; -1 für Fehler
  73.         rts                 ; Programm beenden
  74.  
  75.  
  76. .END